/*
                             *******************
******************************* C SOURCE FILE *******************************
**                           *******************                           **
**                                                                         **
** project		: General Template                                         **
** filename		: MUTEX.C                                                   **
** version		: 1.0                                                      **
** date			: December 31, 1986                                        **
**                                                                         **
*****************************************************************************
**                                                                         **
** Copyright (c) 2011, $pynarak                                            **
** All rights reserved.                                                    **
**                                                                         **
*****************************************************************************

VERSION HISTORY:
----------------

Version			: 1.0
Date 			: December 31, 1986
Revised by 		: $pynarak
Compiler        : GNU GCC
Description 	: Original version.
*/

#define _MUTEX_C_SRC

/****************************************************************************/
/**                                                                        **/
/** MODULES USED                                                           **/
/**                                                                        **/
/****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

/****************************************************************************/
/**                                                                        **/
/** DEFINITIONS AND MACROS                                                 **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/** TYPEDEFS AND STRUCTURES                                                **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/** PROTOTYPES OF LOCAL FUNCTIONS                                          **/
/**                                                                        **/
/****************************************************************************/

void *threadA(void *thread_argv);
void *threadB(void *thread_argv);

/****************************************************************************/
/**                                                                        **/
/** EXPORTED VARIABLES                                                     **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/** GLOBAL VARIABLES                                                       **/
/**                                                                        **/
/****************************************************************************/

pthread_mutex_t mutexVAR = PTHREAD_MUTEX_INITIALIZER;
pthread_t thread1, thread2;

volatile int	counter = 0;

/****************************************************************************/
/**                                                                        **/
/** EXPORTED FUNCTIONS                                                     **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/** LOCAL FUNCTIONS                                                        **/
/**                                                                        **/
/****************************************************************************/

int main (int argc, char *argv[])
{
	int rc1, rc2;

	rc1 = pthread_create(&thread1, NULL, &threadA, NULL);
	if (rc1)
	{
		printf("Thread creation failed: %d\n", rc1);
		exit(-1);
	}
	
	rc2 = pthread_create(&thread2, NULL, &threadB, NULL);
	if (rc2)
	{
		printf("Thread creation failed: %d\n", rc2);
		exit(-1);
	}

	pthread_exit(NULL);
	return 0;
}

void *threadA(void *thread_argv)
{
	printf("Thread A is running.\r\n");
	pthread_mutex_lock(&mutexVAR);
	printf("Thread A lock mutex.\r\n");
	sleep(5);
	counter++;
	printf("Counter value: %d\r\n", counter);
	printf("Thread A unlock mutex.\r\n");
	pthread_mutex_unlock(&mutexVAR);
}

void *threadB(void *thread_argv)
{
	printf("Thread B is running.\r\n");
	pthread_mutex_lock(&mutexVAR);
	printf("Thread B lock mutex.\r\n");
	sleep(2);
	counter++;
	printf("Counter value: %d\r\n", counter);
	printf("Thread B unlock mutex.\r\n");
	pthread_mutex_unlock(&mutexVAR);
}

/****************************************************************************/
/**                                                                        **/
/** EOF                                                                    **/
/**                                                                        **/
/****************************************************************************/
